package ch.mailbox;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;


/** Classe per l'iterazione dei messaggi di un utente.
 * 
 * @author Neil Otupacca - May 21 2011
 *
 */
public class IteratorMessage implements Iterator<Message> {

	private ArrayList<Message> msgsArray;
	private Iterator<Message> msgsIterator;

	/** Constructor dell'iteratore (accesso package).
	 *
	 * @param user - utente a cui appartengono i messaggi.
	 */
	@SuppressWarnings("unchecked")
	IteratorMessage(User user) {
		// Carica tutti i messaggi dell'utente dal database
		Message msg = new Message(user, "", 0, true);
		msgsArray = (ArrayList<Message>) msg.getPersistentObjectList(true, "msgTime DESC");

		try {
			// Ottieni il field "user" della classe Message
			Field field = Message.class.getDeclaredField("user");

			// Setta il field "user" di tutti i messaggi
			msgsIterator = msgsArray.iterator();
			while(msgsIterator.hasNext()) {
				msg = msgsIterator.next();

				// Abilita l'accesso alla variabile nel caso sia privata
				field.setAccessible(true);
				field.set(msg, user);
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

		// Resetta l'iteratore
		msgsIterator = msgsArray.iterator();
	}

	/** Ritorna <i>true</i> se ci sono ancora messaggi da iterare.
	 * 
	 * @return <b>true</b> o <b>false</b>.
	 */
	@Override
	public boolean hasNext() {
		return(msgsIterator.hasNext());
	}

	/** Ritorna il prossimo messaggio dell'iterazione.
	 * 
	 * @return prossimo messaggio dell'iterazione.
	 */
	@Override
	public Message next() {
		return(msgsIterator.next());
	}

	/** Rimuove dalla collection dell'iteratore l'ultimo messaggio
	 * ritornato da next().
	 *
	 */
	@Override
	public void remove() {
		msgsIterator.remove();
	}
}
